1

Webサービスのクラスでは、非常に単純なログインシステムを作成しようとしています。checkCredentialsが呼び出されるたびにcreateAccounts()が無限の時間を取得し続けるという問題があります。なぜですか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.IO;

public class Service : IService
{
    static String path = @"PATH REMOVED";
    List<Account> accounts = new List<Account>();
    StreamWriter sw = null;

    private void createAccounts()
    {
        String data = File.ReadAllText(path);
        string[] data2 = data.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
        string[] temp;
        for (int i = 0; i < data2.Length; i++)
        {
            temp = data2[i].Split(',');
            if(!usernameExists(temp[0]) && temp[0] != "")
            {
                accounts.Add(new Account(temp[0],temp[1]));
            }
        }
    }

    public bool CreateAccount(String username, String password)
    {
        createAccounts();
        sw = File.AppendText(path);
        if (!usernameExists(username))
        {
            sw.WriteLine(username + "," + password + "\n");
            sw.Close();
            sw = null;
            return true;
        }
        else
        {
            sw.Close();
            sw = null;
            return false;
        }
    }

    public bool usernameExists(String username)
    {
        createAccounts();
        if(accounts.Exists(a => a.username == username))
            return true;
        else
            return false;
    }

    public bool CheckCredentials(String username, String password)
    {
        createAccounts();
        if (usernameExists(username))
        {
            if(accounts.Find(a => a.username == username).username == username && accounts.Find(a => a.username == username).password == password)
                return true;
            else
                return false;
        }
        else
            return false;

    }

}

class Account
{
    public String username;
    public String password;

    public Account(String u, String p)
    {
        username = u;
        password = p;
    }

}
4

2 に答える 2

1

あなたはファイルにデータを保存します、あなたはそれを無限に書くべきではありません。あなたが頻繁に要求するとき、それはmuliththreadingでファイルを書きます、スレッドはファイルをロックします。try ... catch ...ファイルを書いて問題を見つけることをお勧めします:

    public bool CreateAccount(String username, String password)
    {
        createAccounts();

        try
        {
            sw = File.AppendText(path);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        if (!usernameExists(username))
        {
            sw.WriteLine(username + "," + password + "\n");
            sw.Close();
            sw = null;
            return true;
        }
        else
        {
            sw.Close();
            sw = null;
            return false;
        }
    }
于 2012-10-27T03:33:47.500 に答える
1

createAccountsとusernameExistsの間にループがあります。data2.Lengthがゼロ以外である限り、無限にループします。

于 2012-10-27T04:17:53.330 に答える